package vip.xiaomaoxiaoke.joinbymemory;

import org.apache.commons.collections4.CollectionUtils;

import java.util.Collections;
import java.util.List;


/**
 * 内存聚合实现接口，
 * */
public interface JoinService {
    /**
     * 单参非集合类
     * 执行内存 join
     * @param t
     */
    default <T> void joinByMemory(T t){
        // 判断是否为空，为空则直接返回
        if (t == null){
            return;
        }
        // 如果不为空，则直接包装成一个集合，然后调用多参集合的方法
        joinByMemory((Class<T>) t.getClass(), Collections.singletonList(t),null);
    }

    default <T> void joinByMemory(T t,String group){
        // 判断是否为空，为空则直接返回
        if (t == null){
            return;
        }
        // 如果不为空，则直接包装成一个集合，然后调用多参集合的方法
        joinByMemory((Class<T>) t.getClass(), Collections.singletonList(t),group);
    }

    /**
     * 单参集合方法
     * */
    default <T> void joinByMemory(List<T> t){
        // 判断是否为空，为空则直接返回
        if (CollectionUtils.isEmpty(t)){
            return;
        }
        // 判断大小是否为1，为1则调用单参为集合方法
        if (t.size() == 1){
            joinByMemory(t.get(0));
        }
        // 获取类型，并且调用多参方法
        joinByMemory((Class<T>) t.get(0).getClass(), t,null);
    }


    default <T> void joinByMemory(List<T> t,String group){
        // 判断是否为空，为空则直接返回
        if (CollectionUtils.isEmpty(t)){
            return;
        }
        // 判断大小是否为1，为1则调用单参为集合方法
        if (t.size() == 1){
            joinByMemory(t.get(0));
        }
        // 获取类型，并且调用多参方法
        joinByMemory((Class<T>) t.get(0).getClass(), t,group);
    }

    /**
     * 执行内存 Join，需要子类去实现，之所以不在接口实现是因为子类可以使用换成，
     * @param tCls 实际类型
     * @param t 需要抓取的集合
     */
    <T> void joinByMemory(Class<T> tCls, List<T> t,String group);

    /**
     * 注册一个类型，主要用于初始化
     * @param tCls
     * @param <T>
     */
    <T> void register(Class<T> tCls,String group);

    <T> void register(Class<T> tCls);
}
